TList and user defined type


You can use TList class for user defined data types such as Records. Below example
is used to store dictionary words in Electronic Book progam, most of TList methods
such as Add, Delete are modified to work with TDicWord record.

type
PDicWord = ^ TDicWord;
TDicWord = record
           Word: string[30];
           Meaning: string[100];
end; { TWord }

TWordsList = Class (TList)
  protected
    function Get(AIndex: integer): PDicWord;
    procedure Put(AIndex: integer; Word:
      PDicWord);
  public
    function Add(Word: TDicWord): integer;
    procedure Delete(AIndex: integer);
    procedure Clear; override;
    procedure Free;
    function IndexOf(Word: string): integer;
    function LoadFromFile(FileName: string):
      Boolean;
    function SaveToFile(FileName: string):
      Boolean;
    procedure Sort;
    property Items[ AIndex: integer ]:
      PDicWord read Get write Put; default;

end; { TWordsList }

implementation

function TWordsList.Get(AIndex: integer): PDicWord;
begin
Result:= inherited Get(AIndex);
end;

procedure TWordsList.Put(AIndex: integer; Word: PDicWord);
begin
inherited Put(AIndex, Word);
end;

(*************  Add word  *****************)

function TWordsList.Add(Word: TDicWord): integer;
var
PWord: PDicWord;
begin
New(PWord);
PWord^:= Word;
Result:= inherited Add(PWord);
end;

(*************  Delete word  ****************)

procedure TWordsList.Delete(AIndex: integer);
var
Temp: pointer;
begin
if not (AIndex in [0 .. Count-1]) then exit;
Temp:= Items[AIndex];
Dispose(Temp);
inherited Delete(AIndex);
end;

(*************  Clear list  *************)

procedure TWordsList.Clear;
var
i: integer;
begin
for i:= 0 to Count-1 do
  Delete(0);
inherited Clear;
pack;
end;

(***********  Free list ***********)

procedure TWordsList.Free;
begin
Clear;
inherited Clear;
end;

(*****************  IndexOf  *******************)

function TWordsList.IndexOf(Word: string): integer;
var
i: integer;
begin
for i:= 0 to Count-1 do
  if UpperCase(Word) = UpperCase(Items[i].Word) then
  begin
    Result:= i;  // found
    exit; (*>>>>>>>*)
  end;
Result:= -1; // not found
end;

(*****************  Load From File *******************)

function TWordsList.LoadFromFile(FileName: string): boolean;
var
F: File of TDicWord;
AWord: TDicWord;
begin
Result:= false;
Clear;
try
  if not FileExists(FileName) then exit; (*>>>>>*)
  AssignFile(F, FileName);
  FileMode:= 0;
  Reset(F);
  while not eof(F) do
  begin
    Read(F, AWord);
    if (AWord.Word <> '') and (AWord.Meaning <> '') then
      Add(AWord);
  end; // while
  CloseFile(F);
  Result:= True; // Successed

except
on e: exception do
    exit;
end; // try
end;

(*****************  Save to File *******************)

function TWordsList.SaveToFile(FileName: string): boolean;
var
i: integer;
F: File of TDicWord;
AWord: TDicWord;
begin
Result:= false;
if Count = 0 then
begin
  if FileExists(FileName) then
    DeleteFile(FileName);
  Result:= True;
  exit; (*>>>>>>>>>*)
end; // if Count

Sort;

try
  AssignFile(F, FileName);
  Rewrite(F);
  for i:= 0 to Count-1 do
  begin
    AWord:= Items[i]^;
    Write(F, AWord);
  end; // for i:= 0
  CloseFile(F);
  Result:= True; // Successed

except
on e: exception do
    exit;
end; // try
end;

(**********************  Words Compare  **********************)

function WordsCompare(Item1, Item2: pointer): integer;
begin
if UpperCase(PDicWord(Item1)^.Word) <
  UpperCase(PDicWord(Item2)^.Word) then
Result:= -1
else
if UpperCase(PDicWord(Item1)^.Word) >
  UpperCase(PDicWord(Item2)^.Word) then
Result:= 1
else
Result:= 0;
end;

(**********************  Sort  **********************)

procedure TWordsList.Sort;
begin
inherited Sort(WordsCompare);
end;


See also

TStringList